/**
  ******************************************************************************
  * @file    _tc32l010_gpio.h
  * @author  CHIPAT Application Team
  * @brief   This file contains all the functions prototypes for the GPIO
  *          firmware library.
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __XS32L010_GPIO_H
#define __XS32L010_GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "tc32l010.h"
#include "tc32l010_rcc.h"

/** @addtogroup XS32L010_StdPeriph_Driver
  * @{
  */

/** @addtogroup GPIO
  * @{
  */
/* Exported types ------------------------------------------------------------*/

/** 
  * @brief  EXTI Trigger enumeration  
  */

typedef enum
{
  INT_Trigger_Rising = 0x01,
  INT_Trigger_Falling = 0x02,  
  INT_Trigger_Rising_Falling = 0x03,
  INT_Trigger_High = 0x04,
  INT_Trigger_Low = 0x05
}INTITrigger_TypeDef;

#define IS_INT_TRIGGER(TRIGGER)  (((TRIGGER) == INT_Trigger_Rising) || \
                                  ((TRIGGER) == INT_Trigger_Falling) || \
                                  ((TRIGGER) == INT_Trigger_Rising_Falling)|| \
                                  ((TRIGGER) == INT_Trigger_High)|| \
                                  ((TRIGGER) == INT_Trigger_Low))


/**
  * @brief GPIO Exti Init structure definition
		These parameters can be values of @ref GPIO_exti_define
  */
typedef struct
{
    uint32_t INT_Line;                      /*!< Specifies the INT lines to be enabled or disabled.
                                                 This parameter can be any combination value of @ref INT_Lines */
    INTITrigger_TypeDef INT_Trigger;        /*!< Specifies the trigger signal active edge for the GPIO int.
                                                 This parameter can be a value of @ref INTTrigger_TypeDef */
    FunctionalState INT_LineCmd;            /*!< Specifies the new state of the selected INT lines.
                                                 This parameter can be set either to ENABLE or DISABLE */ 
} GPIOInt_InitTypeDef;


/** @defgroup INT_Lines 
  * @{
  */

#define INT_Line0       ((uint32_t)0x00001)     /*!< External interrupt line 0 */
#define INT_Line1       ((uint32_t)0x00002)     /*!< External interrupt line 1 */
#define INT_Line2       ((uint32_t)0x00004)     /*!< External interrupt line 2 */
#define INT_Line3       ((uint32_t)0x00008)     /*!< External interrupt line 3 */
#define INT_Line4       ((uint32_t)0x00010)     /*!< External interrupt line 4 */
#define INT_Line5       ((uint32_t)0x00020)     /*!< External interrupt line 5 */
#define INT_Line6       ((uint32_t)0x00040)     /*!< External interrupt line 6 */
#define INT_Line7       ((uint32_t)0x00080)     /*!< External interrupt line 7 */

#define IS_INT_LINE(LINE) ((((LINE) & (uint32_t)0xFFFFFF00) == 0x00) && ((LINE) != (uint16_t)0x00))

#define IS_GET_INT_LINE(LINE)  (((LINE) == INT_Line0) || ((LINE) == INT_Line1) || \
                                ((LINE) == INT_Line2) || ((LINE) == INT_Line3) || \
                                ((LINE) == INT_Line4) || ((LINE) == INT_Line5) || \
                                ((LINE) == INT_Line6) || ((LINE) == INT_Line7))
                                

#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
                                    ((PERIPH) == GPIOB) || \
                                    ((PERIPH) == GPIOC) || \
                                    ((PERIPH) == GPIOD))


/** @defgroup Configuration_Mode_enumeration
  * @{
  */
typedef enum
{
    GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode              */
    GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode             */
    GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
    GPIO_Mode_AN   = 0x03  /*!< GPIO Analog In/Out Mode      */
} GPIOMode_TypeDef;

#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_IN)|| ((MODE) == GPIO_Mode_OUT) || \
                            ((MODE) == GPIO_Mode_AF)|| ((MODE) == GPIO_Mode_AN))
/**
  * @}
  */

/** @defgroup Output_drive_enumeration
  * @{
  */
typedef enum
{
    GPIO_Drive_0 = 0x00,
    GPIO_Drive_1 = 0x01,
    GPIO_Drive_2 = 0x02,
    GPIO_Drive_3 = 0x03,

} GPIODrive_TypeDef;

#define IS_GPIO_DRIVE(DRIVE) (((DRIVE) == GPIO_Drive_0) || \
                              ((DRIVE) == GPIO_Drive_1) || \
                              ((DRIVE) == GPIO_Drive_2) || \
                              ((DRIVE) == GPIO_Drive_3)

/**
  * @}
  */


/** @defgroup Configuration_Pull-Up_Pull-Down_enumeration
  * @{
  */
typedef enum
{
    GPIO_PuPd_NOPULL = 0x00,
    GPIO_PuPd_UP     = 0x03,
    GPIO_PuPd_DOWN   = 0x01,
} GPIOPuPd_TypeDef;

#define IS_GPIO_PUPD(PUPD) (((PUPD) == GPIO_PuPd_NOPULL) || ((PUPD) == GPIO_PuPd_UP) || \
                            ((PUPD) == GPIO_PuPd_DOWN))
/**
  * @}
  */

/** @defgroup Bit_SET_and_Bit_RESET_enumeration
  * @{
  */
typedef enum
{
    Bit_RESET = 0,
    Bit_SET
} BitAction;

#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET))
/**
  * @}
  */

/**
  * @brief  GPIO Init structure definition
  */

typedef struct
{
    uint32_t GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.
                                       This parameter can be any value of @ref GPIO_pins_define */

    GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.
                                       This parameter can be a value of @ref GPIOMode_TypeDef   */

    GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.
                                       This parameter can be a value of @ref GPIOPuPd_TypeDef   */

    GPIODrive_TypeDef GPIO_Drive;   /*!< Specifies the dirve for the selected pins.
                                       This parameter can be a value of @ref GPIODrive_TypeDef  */

    GPIOInt_InitTypeDef GPIO_Int;	    /*!< Specifies Interrupt type for the selected pins.
									   This parameter can be a value of @ref GPIOInt_InitTypeDef */

    uint32_t Alternate;  			/*!< Peripheral to be connected to the selected pins.
									   This parameter can be a value of @ref GPIO_alternate_function_selection */

} GPIO_InitTypeDef;
/* Exported constants --------------------------------------------------------*/

/** @defgroup GPIO_Exported_Constants
  * @{
  */

/** @defgroup GPIO_pins_define
  * @{
  */
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected    */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected    */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected    */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected    */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected    */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected    */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected    */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected    */
#define GPIO_Pin_All               ((uint16_t)0x00FF)  /*!< All pins selected */

#define IS_GPIO_PIN(PIN) ((PIN) != (uint16_t)0x00)

#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \
                              ((PIN) == GPIO_Pin_1) || \
                              ((PIN) == GPIO_Pin_2) || \
                              ((PIN) == GPIO_Pin_3) || \
                              ((PIN) == GPIO_Pin_4) || \
                              ((PIN) == GPIO_Pin_5) || \
                              ((PIN) == GPIO_Pin_6) || \
                              ((PIN) == GPIO_Pin_7)

/**
  * @}
  */

/** @defgroup GPIO_Pin_sources
  * @{
  */
#define GPIO_PinSource0            ((uint8_t)0x00)
#define GPIO_PinSource1            ((uint8_t)0x01)
#define GPIO_PinSource2            ((uint8_t)0x02)
#define GPIO_PinSource3            ((uint8_t)0x03)
#define GPIO_PinSource4            ((uint8_t)0x04)
#define GPIO_PinSource5            ((uint8_t)0x05)
#define GPIO_PinSource6            ((uint8_t)0x06)
#define GPIO_PinSource7            ((uint8_t)0x07)


#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) || \
                                       ((PINSOURCE) == GPIO_PinSource1) || \
                                       ((PINSOURCE) == GPIO_PinSource2) || \
                                       ((PINSOURCE) == GPIO_PinSource3) || \
                                       ((PINSOURCE) == GPIO_PinSource4) || \
                                       ((PINSOURCE) == GPIO_PinSource5) || \
                                       ((PINSOURCE) == GPIO_PinSource6) || \
                                       ((PINSOURCE) == GPIO_PinSource7)

/**
  * @}
  */

/** @defgroup GPIO_exti_define GPIO exti mode define
  * @brief
  * @{
  */
#define  GPIO_EXTI_INT_DISABLE  								0x00000000U
#define  GPIO_EXTI_INT_ENABLE  									0x00000001U

#define  GPIO_EXTI_INT_EDGE  										0x00000000U
#define  GPIO_EXTI_INT_LEVEL  									0x00000001U

#define  GPIO_EXTI_INT_LOWFALL  								0x00000000U
#define  GPIO_EXTI_INT_HIGHRISE 								0x00000001U
#define  GPIO_EXTI_INT_FALLRISE 								0x00000002U

/** @defgroup GPIO_Alternate_function_selection_define
  * @{
  */

/**
  * @brief  AF 0 selection
  */
#define GPIO_AF_0            ((uint8_t)0x00) /* WKUP, EVENTOUT, TIM15, SPI1, TIM17,
                                                MCO, SWDAT, SWCLK, TIM14, BOOT,
                                                USART1, CEC, IR_OUT, SPI2, TS, TIM3,
                                                USART4, CAN, TIM3, USART2, USART3, 
                                                CRS, TIM16, TIM1 */
/**
  * @brief  AF 1 selection
  */
#define GPIO_AF_1            ((uint8_t)0x01) /* USART2, CEC, TIM3, USART1, IR,
                                                EVENTOUT, I2C1, I2C2, TIM15, SPI2,
                                                USART3, TS, SPI1 */
/**
  * @brief  AF 2 selection
  */
#define GPIO_AF_2            ((uint8_t)0x02) /* TIM2, TIM1, EVENTOUT, TIM16, TIM17,
                                                USB */
/**
  * @brief  AF 3 selection
  */
#define GPIO_AF_3            ((uint8_t)0x03) /* TS, I2C1, TIM15, EVENTOUT */

/**
  * @brief  AF 4 selection
  */
#define GPIO_AF_4            ((uint8_t)0x04) /* TIM14, USART4, USART3, CRS, CAN,
                                                I2C1 */

/**
  * @brief  AF 5 selection
  */
#define GPIO_AF_5            ((uint8_t)0x05) /* TIM16, TIM17, TIM15, SPI2, I2C2, 
                                                MCO, I2C1, USB */

/**
  * @brief  AF 6 selection
  */
#define GPIO_AF_6            ((uint8_t)0x06) /* EVENTOUT */
/**
  * @brief  AF 7 selection
  */
#define GPIO_AF_7            ((uint8_t)0x07) /* COMP1 OUT and COMP2 OUT */
/**
  * @brief  AF 8 selection
  */
#define GPIO_AF_8            ((uint8_t)0x08) /* COMP1 OUT and COMP2 OUT */

#define IS_GPIO_AF(AF)   (((AF) == GPIO_AF_0) || ((AF) == GPIO_AF_1) || \
                          ((AF) == GPIO_AF_2) || ((AF) == GPIO_AF_3) || \
                          ((AF) == GPIO_AF_4) || ((AF) == GPIO_AF_5) || \
                          ((AF) == GPIO_AF_6) || ((AF) == GPIO_AF_7) || \
                          ((AF) == GPIO_AF_8) )

/**
  * @}
  */


/**
  * @}
  */

/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
/* Function used to set the GPIO configuration to the default reset state *****/
void GPIO_DeInit(GPIO_TypeDef* GPIOx);

/* Initialization and Configuration functions *********************************/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);

/* GPIO Read and Write functions **********************************************/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_INTConfig(GPIO_TypeDef* GPIOx, GPIOInt_InitTypeDef* INT_InitStruct);
ITStatus GPIO_GetITStatus(GPIO_TypeDef* GPIOx, uint32_t INT_Line);
void GPIO_ClearITPendingBit(GPIO_TypeDef* GPIOx, uint32_t INT_Line);
void GPIO_INTCmd(GPIO_TypeDef* GPIOx, uint32_t INT_Line, FunctionalState NewState);

/**
  * @}
  */

#ifdef __cplusplus
}
#endif

#endif /* __tc32l010_GPIO_H */

/************************ (C) COPYRIGHT CHIPAT *****END OF FILE****/
